Todos nós conhecemos a conhecida função VLOOKUP() que nos ajuda a combinar dados de diferentes tabelas. Porém, esta função tem uma desvantagem significativa - ela não pode combinar valores semelhantes, ou seja, se houver um erro na palavra, não haverá correspondência.
Para poder combinar valores aproximados, podemos criar nossa própria função. Vamos chamá-lo de FuzzyLookup().
Vamos imaginar que temos duas listas. Ambos têm aproximadamente os mesmos elementos, mas podem ser escritos de maneira um pouco diferente. A tarefa é encontrar para cada elemento da primeira lista o elemento mais semelhante da segunda lista, ou seja, implementar uma busca pelo texto maximamente semelhante mais próximo.
A grande questão, neste caso, é o que considerar como critério de “semelhança”. Apenas o número de caracteres correspondentes? É o número de partidas consecutivas? Devem ser considerados caracteres maiúsculas ou espaços? O que fazer com diferentes arranjos de palavras em uma frase? As opções são muitas e não existe uma solução única - para cada situação uma ou outra será melhor que outras.
No nosso caso, implementamos a opção mais simples - pesquisar pelo número máximo de correspondências de caracteres. Não é perfeito, mas funciona muito bem na maioria das situações.
Adicionar função FuzzyLookup , abra o menu Tools - Macros - Edit Macros... , selecione Módulo1 e copie o seguinte texto no módulo:
Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String ' moonexcel.com.ua Dim Str As String Dim CellArray As Variant Dim StrArray As Variant If IsMissing(SimThreshold) Then SimThreshold = 0 Str = LCase(LookupValue) StrArray = Split(Str) StrExt = UBound(StrArray) For Each Cell In SrcTable CellArray = Split(LCase(Cell)) CellExt = UBound(CellArray) CellRate = 0 ' Verificamos cada palavra na frase de pesquisa For x = 0 To StrExt StrWord = StrArray(x) If Len(StrWord) = 0 Then GoTo continue_x MaxStrWordRate = 0 ' Verificamos cada palavra na próxima célula da tabela de valores original For i = 0 To CellExt CellWord = CellArray(i) If Len(CellWord) = 0 Then GoTo continue_i FindCharNum = OccurrenceNum(StrWord, CellWord) StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord)) If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate continue_i: Next i CellRate = CellRate + MaxStrWordRate continue_x: Next x ' Mantemos a melhor combinação If CellRate > MaxCellRate Then MaxCellRate = CellRate BestCell = Cell FindCharNum = OccurrenceNum(Str, Cell) SimRate = FindCharNum / Max(Len(Str),Len(Cell)) End If Next Cell IF SimRate >= SimThreshold Then IF SimThreshold = -1 Then ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")" ElseIf SimThreshold = -2 Then ReturnValue = Format(SimRate, "0.00") Else ReturnValue = BestCell End If Else ReturnValue = "" End If FuzzyLOOKUP = ReturnValue End Function Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String) For i = 1 To Len(SourceString) ' Estamos procurando a ocorrência de cada símbolo Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1) ' Aumentamos o contador de coincidências If Position > 0 Then Count = Count + 1 ' Remova o símbolo encontrado TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position) End If Next i OccurrenceNum = Count End Function Function Max(ByVal value1 As Variant, ByVal value2 As Variant) If value1 > value2 Then Result = value1 Else Result = value2 End If Max = Result End Function
A seguir, feche Macro Editor e volte para a planilha LibreOffice Calc - agora você pode usar nosso novo recurso FuzzyLookup() .
Você também pode usar o recurso FUZZYLOOKUP() instalando a extensão gratuita YouLibreCalc.oxt ou sua versão completa YLC_Utilities.oxt .
Depois disso, esta função estará disponível em todos os arquivos que serão abertos em LibreOffice Calc.